package com.oocl.rcm.db;

public class MyLinkedList<T> {
	private Node<T> head;
	private Node<T> tail;
	private int len;
	
	public MyLinkedList(){
		this.head = new Node<T>(null);
		tail = head;          /////////////////////////////
		len = 0;
	}

	public void add(T t){
		Node node = new Node<T>(t);
		if(head.getNext() == null){
			head.setNext(node);
			node.setPre(head);
//			tail = node;
		}else{
			node.setPre(tail);
			tail.setNext(node);
		}
		tail = node;
		len++;
	}
	
//	public T get(int index){
//		Node<T> node = head.getNext();
//		if(index<0 || index>=len){
//			throw new ArrayIndexOutOfBoundsException();
//		}else{
//			for(int i=0;i<index;i++){
//				node = node.getNext();
//			}
//		}
//		return node.getData();
//	}
	
	public Node<T> get(int index){
		Node<T> node = head.getNext();
		if(index<0 || index>=len){
			throw new ArrayIndexOutOfBoundsException();
		}else{
			for(int i=0;i<index;i++){
				node = node.getNext();
			}
		}
		return node;
	}

//	public void remove(T t){
//		Node<T> node = head;
//		for(int i=0; i<len; i++){
//			node = node.getNext();
//			if(node.getData().equals(t)){
//				node.getPre().setNext(node.getNext());
//				node.getNext().setPre(node.getPre());
//				len--;
//			}
//		}
//	}
	
	public void remove(int index){
		Node node = get(index);
		if(node.getNext()!=null){
			node.getPre().setNext(node.getNext());
			node.getNext().setPre(node.getPre());
		}else{
			tail = node.getPre();
			node.getPre().setNext(null);
		}
		len--;
	}
	
	public int getLen() {
		return len;
	}
	
}
